Android 签名原理

数据摘要

数据摘要算法是一种能产生特定输出格式的算法,其原理是根据一定的运算规则对原始数据进行某种形式的信息提取,被提取出的信息就是原始数据的消息摘要,也称为数据指纹。

一般情况下,数据摘要算法具有以下特点:

  • 无论输入数据有多大(长),计算出来的数据摘要的长度总是固定的。例如:MD5算法计算出的数据摘要有128Bit。
  • 一般情况下(不考虑碰撞的情况下),只要原始数据不同,那么其对应的数据摘要就不会相同。同时,只要原始数据有任何改动,那么其数据摘要也会完全不同。即:相同的原始数据必有相同的数据摘要,不同的原始数据,其数据摘要也必然不同。
  • 不可逆性,即只能正向提取原始数据的数据摘要,而无法从数据摘要中恢复出原始数据。

    著名的摘要算法有RSA公司的MD5算法和SHA系列算法。

数字签名与数字证书

数字签名和数字证书是成对出现的,两者不可分离(数字签名主要用来校验数据的完整性,数字证书主要用来确保公钥的安全发放)。

要明白数字签名的概念,必须要了解数据的加密、传输和校验流程。一般情况下,要实现数据的可靠通信,需要解决以下两个问题:

1.确定数据的来源是其真正的发送者。 2.确保数据在传输过程中,没有被篡改,或者若被篡改了,可以及时发现。

而数字签名,就是为了解决这两个问题而诞生的。 首先,数据的发送者需要先申请一对公私钥对,并将公钥交给数据接收者。 然后,若数据发送者需要发送数据给接收者,则首先要根据原始数据,生成一份数字签名,然后把原始数据和数字签名一起发送给接收者。 数字签名由以下两步计算得来:

1.计算发送数据的数据摘要 2.用私钥对提取的数据摘要进行加密

这样,数据接收者拿到的消息就包含了两块内容:

1.原始数据内容 2.附加的数字签名

接下来,接收者就会通过以下几步,校验数据的真实性:

用相同的摘要算法计算出原始数据的数据摘要。 用预先得到的公钥解密数字签名。 对比签名得到的数据是否一致,如果一致,则说明数据没有被篡改,否则数据就是脏数据了。 因为私钥只有发送者才有,所以其他人无法伪造数字签名。这样通过数字签名就确保了数据的可靠传输。 综上所述,数字签名就是只有发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对发送者发送数据真实性的一个有效证明。

想法虽好,但是上面的整个流程,有一个前提,就是数据接收者能够正确拿到发送者的公钥。如果接收者拿到的公钥被篡改了,那么坏人就会被当成好人,而真正的数据发送者发送的数据则会被视作脏数据。那怎么才能保证公钥的安全性那?这就要靠数字证书来解决了。

数字证书是由有公信力的证书中心(CA)颁发给申请者的证书,主要包含了:证书的发布机构、证书的有效期、申请者的公钥、申请者信息、数字签名使用的算法,以及证书内容的数字签名。

可见,数字证书也用到了数字签名技术。只不过签名的内容是数据发送方的公钥,以及一些其它证书信息。 这样数据发送者发送的消息就包含了三部分内容:

原始数据内容 附加的数字签名 申请的数字证书。 接收者拿到数据后,首先会根据CA的公钥,解码出发送者的公钥。然后就与上面的校验流程完全相同了。

所以,数字证书主要解决了公钥的安全发放问题。 因此,包含数字证书的整个签名和校验流程如下图所示: